[SQL] SQL注入问题

Posted by Aerber Zhou on 2015-07-20

sql注入所导致的一些问题

http://www.cnblogs.com/hkncd/archive/2012/03/31/2426274.html

为了防止SQL注入问题,切记的一点是不要使用字符串拼接,这样出现SQL注入的可能性很大,就算使用字符过滤、字符串检测、字符串替换、存储过程或者其他方法,危险系数还是很大的。

SQL注入的本质是输入特殊符号(例如’ ” . 之类的)破坏了SQL语句,导致数据泄露

目前我看到的解决方案是使用参数化SQL

比如以前这样一条查询语句

1
2
string key;
string sql = "select * from DB where key like '"%"+myKey+"%"'";

这是条模糊查询

我们可以考虑把使用参数化SQL查询

改写成以下:

1
2
string key;
string sql = "select * from DB where key like @key"

但是我们的代码不一定会智能到知道包含在这个string类型的sql中,@key就是指代我们的string的key

目前我是在C#下开发,所以我们使用一个C#下的SqlParameter把实际的值和SQL语句中的链接起来

在不同的语言环境中,sql的参数化查询使用不同

SqlParameter来自System.Date.SqlClient

1
2
3
SqlParameter spmKey = new SqlParametr();
spmKey.ParameterName = "@key";
spmKey.Value = key;

仅仅这样是不行的,虽然我们已经建立了SqlParameter实体,也把@key和key变量给了spmkey,但是spmKey和我们的sqlconnection和sqlAdapter毫无联系(sqlconnection和sqlAdapter是我们在C#中链接microsoft sql server的方式)

1
2
3
4
5
6
7
8
9
SqlConnection conn = new SqlConnection(System.ConfigureManger.ConnectionString["DB"].ConnectionString.tosString);
string sql = "select * from DB where key like @key";
SqlDataAdapter sda = new SqlDateAdapter(sql,sda);
DataTable dt = new DataTable();
SqlParameter spmKey = new SqlParametr();
spmKey.ParameterName = "@key";
spmKey.Value = key;
sda.SelectCommand.Parameter.Add(spmKey);
sda.Fill(dt);

如果觉得这样太麻烦了,可以简洁的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
SqlConnection conn = new SqlConnection(System.ConfigureManger.ConnectionString["DB"].ConnectionString.tosString);
string sql = "select * from DB where key like @key";
SqlDataAdapter sda = new SqlDateAdapter(sql,sda);
DataTable dt = new DataTable();

//SqlParameter spmKey = new SqlParametr();
//spmKey.ParameterName = "@key";
//spmKey.Value = key;
//sda.SelectCommand.Parameter.Add(spmKey);
//从2.0开始有了AddWithValue
sda.SelectCommand.Parameter.AddWithValue("@key",key);

sda.Fill(dt);

以上就完成了我们用参数化防止SQL注入的方式